observability 向き合い
ラベルによるリソースの認識がうまく存在する世界
こういうのものがない世界では設定の疎結合性とかはない
やりたい
設定の疎結合性
o11y に関連する設定はアプリケーションのデプロイメントに関与するのであって,監視ミドルウェアで長いアプリケーションの列を管理したくない
既存のアプリケーションの利用
そもそもログが stdout に吐かれてくれないと困るが
種類別
メトリック
OpenMetrics の場合 pull させるため監視ミドルウェアがエンドポイントを知る必要があるが Prometheus の kubernetes_sd_configや Prometheus Operator の Monitor 系リソースがこれを可能にする どうやって push 先のエンドポイントを得るか?という問題はあるがクラスタ内にデフォルトサービスがあればそこまで問題にはならない
tosuke.icon としては pull 型の OpenMetrics のほうが curl 一発で確認できる容易さという点で好みだけれどどちらでもいい
特にトレースを扱っている場合は otel の計装の準備ができているからそのまま otel でやってしまったほうが楽なような気もする
三択くらいある
Prometheus の OTLP 対応を使って直接 OR otelcol w/ prometheus remote write exporter を使って間接 複数インスタンスの場合分散方式によって考える余地が生まれる
Pull ベース分散
複数インスタンスが1つの exporter にそれぞれリクエストを飛ばす方式
2 を採用するべき
Pull ベースな分散は exporter 単位でしか分割ができないので利用可能なら Push ベースのほうがよい気もする
Push ベース分散をしている場合割とどうにでもなる
なぜなら Prometheus のベースが Pull である時点でこの手の方式は Pull を受け入れる口を持っているから 前述した otelcol の prometheus receiver はその選択肢の1つ
attribute / label へのマッチングベースの書き換え / メトリックの削除といった設定をアプリケーションごとにいい感じに設定する方法はほぼない
ほぼないが,あんまりそういうことをしたい機会がないので必要になったら otelcol をサイドカーにすればいいんじゃないかなあ
監視のためのルールの記述はどうしようもなくて困る
ログ
stdout / stderr に吐く一択だと思う
開発中に見たいから
集める手段は色々あります
fluentd (or fluent-bit)
よくしらない……
otelcol w/ filelogreceiver + receivercreator + k8s-observer でできそう
ちゃんと取るのはまあまあ面倒
システムログは journald から取ったりする
promtail には journald source があるし,otelcol にも journaldreceiver がある ログはメトリックと違って各アプリケーションが適当に吐いているので横断的な情報を取るためにパースをかける必要があるが……
少なくともタイムスタンプと severity くらいは欲しいが,一般にはアプリケーションごとに異なる
JSON だったら……みたいな分岐をかけ,その下で色々やることはできる気がする
テンプレート芸といった感じに
トレース
それ以外のやつが広く使われるなら otelcol の receiver にする,そこまで使われていないならサイドカーで対応
あんまりどう運用されるべきなのかわからん,自分の中のユースケースが不足している
一番自由度の低い構造なのでだいたいの項目が横断的関心事として処理できるように見える
計装される側は環境変数である程度動作を変えられるようにしておき,外からは otelcol をサイドカーで注入しても DaemonSet とかで起動して環境変数だけ投入するとかでも同じ感じで使えるようにしておくとよさそう